# 5.1.定义不帶參數的函数:
# def 函数名():
def interview():
    # 函数体
    print("把求职者带到3号会议室")
    print("请求职者 完成答卷")
    print("让测试经理来面试 求职者")
    print("让技术总监面试 求职者")


# 函数调用:
# 函数名()
interview()
print(f'不帶參數的函数：{interview}')


# 5.2.定义帶參數的函数:
# def 函数名(参数...):
def interview2(interviewee):
    print("求职者是 " + interviewee)
    print("把求职者带到3号会议室")
    print("请求职者 完成答卷")
    print("让测试经理来面试 求职者")
    print("让技术总监面试 求职者")


# 函数调用：
# 函数名(传参...)
interview2('王小五')
print(f'帶參數的函数：{interview2}')


# 5.3.函数的返回值:
def cal(num1, num2):
    # 函数体 使用 return 返回结果
    return num1 + num2


# 函数调用：
total = cal(1, 2)
print(f'函数的返回值：{total}')


# 5.4.缺省值参数:
# 我们调用该函数的时候，第二个参数通常都是填写 60，这样显得就有些麻烦
# num = overScoreStudents(ssList, 60)
# 这时候，可以在定义函数的时候，给它加上缺省值，像下面这样：score=60
# 函数的参数定义，一旦有缺省值后，后面所有的参数必须都有缺省值
def overScoreStudents(studentScoreList, score=60):
    count = 0
    # 下面的代码用到了循环和判断，后面章节会学习到
    for ss in studentScoreList:
        if ss >= score:
            count += 1
    return count


# 这样，在调用这个函数的时候，如果score参数还是传入60 就可以不用写了，像这样
num = overScoreStudents([50, 60, 70, 80, 90, 95, 100])
print(f'缺省值参数-及格人数：{num}')


# 解释器发现该函数参数score有缺省值，就会自动帮我们传入缺省值60 给 参数score。
# 当然如果我们调用的时候传入了参数，比如像下面这样，解释器就会将 70 传给参数score。
# num = overScoreStudents(ssList, 70)


# 5.5.指定参数名调用函数
def func(arg1, arg2, arg3=3, arg4='hello'):
    print(f'指定参数名调用函数：{arg1}')
    print(f'指定参数名调用函数：{arg2}')
    print(f'指定参数名调用函数：{arg3}')
    print(f'指定参数名调用函数：{arg4}')


# 一般调用
func(1, 2, 3, 'hello')
# 指定参数名
func(arg1=4, arg2=5, arg3=6, arg4='指定参数名')
# 指定参数名调用的时候，可颠倒参数的次序
func(arg2=7, arg3=8, arg1=9, arg4='指定参数名时，可颠倒参数的次序')
# 混合使用
func(10, 11, arg3=12, arg4='混合使用')

# 5.6.变量的有效范围：
# 全局变量 numSum
numSum = 10


def func(num1, num2):
    # ret 是局部变量
    # numSum 是全局变量，能被调用
    ret = num1 + num2 + numSum
    return ret


number = func(1, 2)
print(number)
# 在函数外部无法调用局部变量 ret
print(ret)
